package com.softeem.yqst_server.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.yqst_server.dto.Result;
import com.softeem.yqst_server.entity.Music;
import com.softeem.yqst_server.entity.Musiclist;
import com.softeem.yqst_server.service.MusicService;
import com.softeem.yqst_server.service.MusiclistService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

/**
 * @author TK
 * {@code @CreateTime} 2024/6/1 下午6:59
 * {@code @Description:}
 * {@code @Version:1.0}
 */
@RequestMapping("/musiclist")
@RestController
public class MusiclistController {
    /*
     * 完成歌单相关管理功能
     * 1.歌单创建(提供歌单对象)
     * 2.歌单删除（提供歌单id）
     * 3.歌单列表查询
     * 4.歌单详情查询（查询歌单中所有的歌曲信息）
     * 5.歌单搜索
     * 6.向歌单中添加歌曲
     * 7.移除歌单中歌曲信息
     */

    @Autowired
    private MusiclistService musiclistService;

    @Autowired
    private MusicService musicService;
    private Object list;

    //1.歌单创建(提供歌单对象)
    @PostMapping("/add")
    public Result add(Musiclist musiclist) {
        boolean b = musiclistService.save(musiclist);
        return b ? Result.ok().setMsg("歌单创建成功").setData(musiclist) : Result.fail().setMsg("歌单创建失败");
    }

    //2.歌单删除(根据ID)
    @DeleteMapping("/delete/{id}")
    public Result delete(Integer id) {
        boolean b = musiclistService.removeById(id);
        return b ? Result.ok().setMsg("删除成功") : Result.fail().setMsg("删除失败");
    }

    //3.歌单列表查询
    @GetMapping("/listAll")
    public Result listAll() {
        return Result.ok().setData(musiclistService.list());
    }

    //分页查询歌单列表信息
    @GetMapping("/list")
    public Result list(Integer page, Integer limit) {
        //分页查询（需要配置分页拦截器  select * from musiclist limit ?,?）
        List<Musiclist> musiclistIPage = musiclistService.list(new Page<Musiclist>(page, limit));
        return Result.ok().setData(musiclistIPage);
    }

    //4.歌单详情查询（查询歌单中所有的歌曲信息）
    @GetMapping("/detail")
    public Result detail(Integer id, Integer page, Integer limit) {
        // 通过歌单服务查询歌单详情
        Musiclist musiclist = musiclistService.getById(id);
        if (Objects.isNull(musiclist)) {
            return Result.fail().setMsg("歌单不存在");
        }
        // 构建查询条件包装器，根据歌单ID查询音乐
        QueryWrapper<Music> query = Wrappers.query(Music.class).inSql("id", "SELECT mid FROM musiclist_details WHERE listid = " + id);
        //inSql 是 MyBatis-Plus 提供的一个方法，用于构建子查询条件。在这里，inSql 方法用于在查询条件中包含子查询
        // 通过音乐服务查询音乐列表(含分页)
        List<Musiclist> musicList = musiclistService.list(new Page<Musiclist>(page, limit));
        return Result.ok().setData(musicList);
    }

    //5.歌单搜索
    @GetMapping("/search")
    public Result search(String name, Integer page, Integer limit) {
        // 构建查询条件包装器，根据歌单名称模糊查询
        QueryWrapper<Musiclist> query = Wrappers.query(Musiclist.class).like("name", name);
        // 分页查询歌单列表
        List<Musiclist> musicLists = musiclistService.list(new Page<Musiclist>(page, limit));
        // 检查是否有结果
        if (musicLists.isEmpty()) {
            return Result.fail().setMsg("没有找到相关歌单");
        }
        return Result.ok().setData(musicLists);
    }

    //6.向歌单中添加歌曲
    @PostMapping("/addMusic")
    public Result addMusic(Integer musiclistId, Integer musicId) {
        boolean b = musiclistService.save(musiclistId, musicId);
        return b ? Result.ok().setMsg("歌曲添加成功") : Result.fail().setMsg("歌曲添加失败");
    }

    //7.移除歌单中歌曲信息
    @DeleteMapping("/removeMusic")
    public Result removeMusic(Integer musiclistId, Integer musicId) {
        boolean b = musiclistService.removeById(musiclistId, musicId);
        return b ? Result.ok().setMsg("歌单移除成功") : Result.fail().setMsg("歌单移除失败");
    }
}
